/**
 * Buffer数组转换工具
 */

/**
 * 将10进制的buffer数组转换为16进制字符串数组
 * @param buffer 10进制数字数组
 * @returns 16进制字符串数组，每个元素都是 "0x" 开头的16进制表示
 */
export function bufferToHexArray(buffer: number[]): string[] {
  return buffer.map((num) => {
    // 确保是有效的数字，并限制在0-255范围内
    const validNum = Math.max(0, Math.min(255, Math.floor(num || 0)));
    // 转换为16进制，补零到2位，添加0x前缀
    return `${validNum.toString(16).padStart(2, "0")}`;
  });
}

/**
 * 将16进制字符串数组转换回10进制数组（逆向转换）
 * @param hexArray 16进制字符串数组
 * @returns 10进制数字数组
 */
export function hexArrayToBuffer(hexArray: string[]): number[] {
  return hexArray.map((hex) => {
    // 移除0x前缀并转换为数字
    const cleanHex = hex.replace(/^0x/i, "");
    const num = parseInt(cleanHex, 16);

    return isNaN(num) ? 0 : num;
  });
}

/**
 * 将10进制数组转换为 ASCII 字符串数组
 * @param hexArray 10进制数组
 * @returns 对应的 ASCII 字符数组
 */
export const decimalArrayToAsciiArray = (decimalArray: number[]): string[] => {
  return decimalArray.map((num) => {
    // 验证数字是否在 ASCII 有效范围内 (0-255)
    if (num < 0 || num > 255 || !Number.isInteger(num)) {
      throw new Error(`无效的 ASCII 值: ${num}（必须是 0-255 的整数）`);
    }

    return String.fromCharCode(num);
  });
};

export function decimalToBinary(n: number): string {
  if (!Number.isFinite(n)) throw new Error("Input must be a finite number");
  if (!Number.isInteger(n)) throw new Error("Input must be an integer");
  return n.toString(2); // 负数会返回带 '-' 的二进制字符串
}
